/** ***********************************************************************************
* @file         unit_test.h
* @brief        单元接口测试
* @details      主要用来近单元功能模块接口的测试等功能
* @author       杨小珛
* @date         2021/02/19
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/
#ifndef UNIT_TEST_H
#define UNIT_TEST_H

#include "gaoz_api.h"

/***************************UNIT 测试的状态*******************************************/
typedef enum
{
    UNIT_NO_COM    = 0x0000, /*没有测试命令*/
    UNIT_BEGIN_COM = 0x0001, /*启动测试命令*/
    UNIT_OPEN_COM  = 0x0002, 
    UNIT_WRITE_COM  = 0x0003, 
    UNIT_READ_COM  = 0x0004, 
    UNIT_OPT_COM  = 0x0005, 
    UNIT_CLOSE_COM  = 0x0006, 
}unit_test_status_type_e;
/**********************模块类型(Device type)定义**************************************/
typedef enum
{
    UNIT_NO_DEV             = 0x0000,   /*无*/
    UNIT_NET                = 0x0001,   /*网络通信模块接口*/
    UNIT_MCU                = 0x0002,   /*MCU通信模块接口*/
    UNIT_FLASH              = 0x0003,   /*系统内存数据存储接口*/
    UNIT_RTC                = 0x0004,   /*RTC系统时钟模块接口*/
    UNIT_GPS                = 0x0005,   /*GPS系统时钟模块接口*/
    UNIT_BLE                = 0x0006,   /*BLE系统时钟模块接口*/
    UNIT_MAX                = 0x00FF,   /*未知(Unkown device)*/
}unit_mode_type_e;

/**********************UINTE 模块接口测试数据结构************************************/
#define UINT_NAME_MAX_LEN ( 16 )
typedef struct 
{
    unit_mode_type_e    type;                               /*单元测试的类型*/
    uint8_t             name[UINT_NAME_MAX_LEN];            /*单元测试的名称*/
    uint32_t ( *unit_open )  ( uint8_t  n,  uint8_t *arg ); /*打开操作*/
    uint32_t ( *unit_write ) ( uint8_t  n,  uint8_t *arg ); /*写操作*/
    uint32_t ( *unit_read )  ( uint8_t  n,  uint8_t *arg ); /*读操作*/
    uint32_t ( *unit_opt )   ( uint8_t  n,  uint8_t *arg ); /*配置操作*/
    uint32_t ( *unit_close ) ( uint8_t  n,  uint8_t *arg ); /*关闭操作*/
}unit_test_interface_typedef;

#define UNIT_ARG_STR_MAX_LEN ( 1500 )

#pragma pack(1)
typedef struct 
{
    uint8_t num; /*序号*/
    uint8_t len; /*数据长度*/
    uint8_t arg; /*参数信息*/
}unit_arg_int8_type;

typedef struct 
{
    uint8_t num; /*序号*/
    uint8_t len; /*数据长度*/
    uint16_t arg; /*参数信息*/
}unit_arg_int16_type;

typedef struct 
{
    uint8_t num; /*序号*/
    uint8_t len; /*数据长度*/
    uint32_t arg; /*参数信息*/
}unit_arg_int32_type;

typedef struct 
{
    uint8_t num; /*序号*/
    uint16_t len; /*数据长度*/
    uint8_t arg[UNIT_ARG_STR_MAX_LEN]; /*参数信息*/
}unit_arg_str_type;
#pragma pack()

typedef struct 
{
    uint8_t pos;
    uint8_t num;
    uint8_t *arg;
}unit_arg_type;

/** ****************************************************************************
* @remarks       void unit_test_create_task( unsigned portBASE_TYPE uxPriority )
* @brief         单元测试接口任务
* @param[in]     uxPriority 优先级
* @param[out]    无
* @return        无
* @attention     在系统启动后进行创建
*******************************************************************************/
extern void unit_test_create_task( unsigned portBASE_TYPE uxPriority );

#endif

